import os

from django.shortcuts import render, redirect, HttpResponse
from django import forms

from app import models
from app.utils.bootstrap import BootstrapForm, BootstrapModelForm
from django.conf import settings


class UpForm(BootstrapForm):
    """文件上传演示表单 """

    exclude_filed = ['img']  # 过滤字段不让引用Bootstrap样式

    name = forms.CharField(label='姓名')
    age = forms.IntegerField(label='年龄')
    img = forms.FileField(label='头像')


def upload_list(request):
    """ 上传文件 """
    if request.method == 'GET':
        return render(request, 'upload_list.html')

    # POST请求
    file_object = request.FILES.get('avator')
    file_name = file_object.name

    # 将接收到的文件，分块写入
    with open(f'app/static/upload/{file_name}', 'wb') as f:
        for chunk in file_object.chunks():
            f.write(chunk)

    return HttpResponse('上传成功')


def upload_form(request):
    """Form表单上传文件演示 """
    title = 'Form上传'

    # get请求，只显示空白表单
    if request.method == 'GET':
        form = UpForm()
        return render(request, 'upload_form.html', {'form': form, 'title': title})

    form = UpForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        print(form.cleaned_data)
        # cleaned_data  =  {'name': 'tom', 'age': 24, 'img': < InMemoryUploadedFile: 780.jpg(image / jpeg) >}
        # 下一步就是处理获取到数据

        # 对于上传的图像来说，先保存到本地，数据表中存储路径
        image_object = form.cleaned_data.get('img')
        file_name = image_object.name

        # 在这里没有用windows的方式，
        # 为了确保在不同系统间都可以用到，
        # 所以用os拼接路径 （app/upload/xxx.jpg）

        # 重点：django只认静态文件保存在static目录下，用户上传的文件在media目录下（需配置）
        # 所以想展示图片，就保存在media目录下
        # file_path = os.path.join(settings.MEDIA_ROOT, 'upload', file_name) # 取得是绝对路径D:\xx\xxx\xxx
        file_path = os.path.join('media', 'upload', file_name)

        # 将接收到的文件，分块写入
        with open(file_path, 'wb') as f:
            for chunk in image_object.chunks():
                f.write(chunk)

        # 保存数据到数据库 name,age,img对应表字段，值是从form.cleaned_data获取到的
        # 因为form.cleaned_data里面最初保存的是一个文件对象，所以把他替换为文件路径
        models.Boss.objects.create(
            name=form.cleaned_data['name'],
            age=form.cleaned_data['age'],
            img=file_path,  # 图片地址保存的是static目录下
        )

        return HttpResponse('上传成功')

    return render(request, 'upload_form.html', {'form': form, 'title': title})


class UploadModelForm(BootstrapModelForm):
    exclude_filed = ['img']  # 过滤字段不让引用Bootstrap样式
    class Meta:
        model = models.City
        fields = '__all__'



def upload_modelform(request):
    """ 上传文件 """
    if request.method == 'GET':
        form = UploadModelForm()
        return render(request, 'upload_form.html', {'form': form,'title':'ModelForm上传文件'})

    form = UploadModelForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        # 对于文件会自动保存
        # 路径是在models中定义的路径
        # 字段中保存的是路径字符串
        form.save()
        return HttpResponse('上传成功')

    return render(request, 'upload_form.html', {'form': form, 'title': 'ModelForm上传文件'})